package com.vvv.designpattern.service.decorator;

import com.vvv.designpattern.pojo.BusinessLaunch;
import com.vvv.designpattern.pojo.Order;
import com.vvv.designpattern.service.inter.OrderServiceInterface;

import java.util.List;

/**
 * @author vvv
 * @date 2023-11-24 16 05
 * discription 装饰器模式：这里引入装饰器模式是为了处理服务降级的逻辑，
 * 也就是积分更新和红包发放并不是电商业务的主要功能，当出现高并发时（比如双11），我们需要去对这些功能进行降级处理，
 * 但是我们采用的三层降级逻辑（正常服务-> 延时服务 -> 暂停服务）是很复杂的，是不能直接写在orderService里的pay方法里面的
 * 所以我们需要在不改变pay原因逻辑的基础上，新增加功能，所以引出了装饰器模式
 * AbstractOrderServiceDecorator为抽象装饰角色，需要去
 *
 * ==========================================================================================
 * 在支付完成后，业务投放也是次要的业务，因此业务投放业务也是需要给pay方法做装饰的
 */
public abstract class AbstractOrderServiceDecorator implements OrderServiceInterface {

    private OrderServiceInterface orderService;

    public void setOrderService(OrderServiceInterface orderService) {
        this.orderService = orderService;
    }

    @Override
    public Order createOrder(String productId) {
        return this.orderService.createOrder(productId);
    }

    @Override
    public Order pay(String orderId) {
        return this.orderService.pay(orderId);
    }

    @Override
    public Order send(String orderId) {
        return this.orderService.send(orderId);
    }

    @Override
    public Order receive(String orderId) {
        return this.orderService.receive(orderId);
    }

    @Override
    public String getPayUrl(String orderId, Float price, Integer payType) {
        return this.orderService.getPayUrl(orderId, price, payType);
    }

    /**
     * 根据userId和productId更新积分和分发红包
     * @param productId 产品id，购买部分产品需要发放红包，部分不用
     * @param serviceLevel 服务级别（正常服务，延时服务，暂停服务）
     * @param price 商品价格
     */
    protected abstract void updateScoreAndSendRedPaper(String productId, int serviceLevel, float price);

}
